{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Output widgets: leveraging Jupyter's display system"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import ipywidgets as widgets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "The `Output` widget can capture and display stdout, stderr and [rich output generated by IPython](http://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html#module-IPython.display). You can also append output directly to an output widget, or clear it programmatically."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "out = widgets.Output(layout={'border': '1px solid cyan'})\n",
    "out"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After the widget is created, direct output to it using a context manager. You can print text to the output area:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "with out:\n",
    "    for i in range(10):\n",
    "        print(i, 'Hello world!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Rich output can also be directed to the output area. Anything which displays nicely in a Jupyter notebook will also display well in the `Output` widget."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from IPython.display import YouTubeVideo\n",
    "with out:\n",
    "    display(YouTubeVideo('eWzY2nGfkXk'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can even display complex mimetypes, such as nested widgets, in an output widget."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "with out:\n",
    "    display(widgets.IntSlider())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also append outputs to the output widget directly with the convenience methods `append_stdout`, `append_stderr`, or `append_display_data`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "out = widgets.Output(layout={'border': '1px solid cyan'})\n",
    "out.append_stdout('Output appended with append_stdout')\n",
    "out.append_display_data(YouTubeVideo('eWzY2nGfkXk'))\n",
    "out"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that `append_display_data` cannot currently be used to display widgets. The status of this bug is tracked in [this issue](https://github.com/jupyter-widgets/ipywidgets/issues/1811)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can clear the output by either using `IPython.display.clear_output` within the context manager, or we can call the widget's `clear_output` method directly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "out.clear_output()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`clear_output` supports the keyword argument `wait`. With this set to `True`, the widget contents are not cleared immediately. Instead, they are cleared the next time the widget receives something to display. This can be useful when replacing content in the output widget: it allows for smoother transitions by avoiding a jarring resize of the widget following the call to `clear_output`.\n",
    "\n",
    "Finally, we can use an output widget to capture all the output produced by a function using the `capture` decorator."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "@out.capture()\n",
    "def function_with_captured_output():\n",
    "    print('This goes into the output widget')\n",
    "    raise Exception('As does this')\n",
    "    \n",
    "function_with_captured_output()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`out.capture` supports the keyword argument `clear_output`. Setting this to `True` will clear the output widget every time the function is invoked, so that you only see the output of the last invocation. With `clear_output` set to `True`, you can also pass a `wait=True` argument to only clear the output once new output is available. Of course, you can also manually clear the output any time as well."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "out.clear_output()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Output widgets as the foundation for interact\n",
    "\n",
    "The output widget forms the basis of how interact and related methods are implemented. It can also be used by itself to create rich layouts with widgets and code output. One simple way to customize a UI is to use `interactive_output` and capture its output. In the next example, we stack the controls vertically and then put the output of the function to the right."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = widgets.IntSlider(description='a')\n",
    "b = widgets.IntSlider(description='b')\n",
    "c = widgets.IntSlider(description='c')\n",
    "def f(a, b, c):\n",
    "    print('{}*{}*{}={}'.format(a, b, c, a*b*c))\n",
    "\n",
    "out = widgets.interactive_output(f, {'a': a, 'b': b, 'c': c})\n",
    "\n",
    "interactive_out_example = widgets.HBox([widgets.VBox([a, b, c]), out])\n",
    "interactive_out_example"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "See the [Output widget documentation](https://ipywidgets.readthedocs.io/en/stable/examples/Output%20Widget.html) for more ways to use the widget."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sidecar: Like output, but on the side\n",
    "\n",
    "The output widget is helpful but some times it is useful to display output on to the side of the notebook so that the ouitput can be seen as you scroll through the notebook.\n",
    "\n",
    "The `Sidecar` widget does that. Using it is like using an output widget: create an instance of `Sidecar`, use it as a context manager, and display output in the sidecar."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sidecar import Sidecar\n",
    "\n",
    "side = Sidecar(title='Example');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "with side:\n",
    "    print('Hello from the side!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The sidecar widget also comes with a capture decorator like the output widget."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "@side.capture()\n",
    "def func():\n",
    "    print('Greetings from the function')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "func()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Widgets can be placed in the sidecar too."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "i = widgets.IntSlider()\n",
    "\n",
    "with side:\n",
    "    display(i)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Clear the sidecar the same you do an output widget."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "side.clear_output()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Exercise\n",
    "\n",
    "Make a new sidecar whose title is \"Triple product\" and that contains the `interactive_out_example` from above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# %load solutions/sidecar-triple.py"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "widgets-tutorial",
   "language": "python",
   "name": "widgets-tutorial"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "067590c647ef4381af813a832ac957f4": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {
       "border": "1px solid black"
      }
     },
     "2194b763d5d44bd7bdf3fe386ed3eaf0": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "2af886b9351540bd9d339b6444c4c0e5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "32f2ae1ff1744e4ebf5aea3e188c7774": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "IntSliderModel",
      "state": {
       "description": "b",
       "layout": "IPY_MODEL_81e818d308b04735b0a7be8e3f4e7f61",
       "style": "IPY_MODEL_879629718b224c37a05f58bae6f1d145"
      }
     },
     "3e7d2d4ad33c4a4a92c26af82a8079c6": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_5a1effa4fbd140939f2959ffc08925b9",
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "1 ** some text\n"
        },
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "2 **** some text\n"
        },
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "3 ****** some text\n"
        },
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "4 ******** some text\n"
        },
        {
         "data": {
          "text/html": "<em>All done!</em>",
          "text/plain": "<IPython.core.display.HTML object>"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ]
      }
     },
     "42f2b3f5056742cbb385d87c5965daf9": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "4cd9031ac694476f8be34810fb6a85c0": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_9595fd27deb54240b79a312704d9751b"
      }
     },
     "4e0a980d6db145dd846170a4532f8e66": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "5a1effa4fbd140939f2959ffc08925b9": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "664dce3fede04de69b413545e81a2d68": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "IntSliderModel",
      "state": {
       "description": "c",
       "layout": "IPY_MODEL_4e0a980d6db145dd846170a4532f8e66",
       "style": "IPY_MODEL_b04e215a9e414b1f8bfc0af39c2fa472"
      }
     },
     "670cda42c4464cfab1079a63b18298c2": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "ButtonStyleModel",
      "state": {}
     },
     "69704196a2f7415f89547b47b247530f": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_f5b3c2be494547a181d21595b3f8e202",
        "IPY_MODEL_73061142b6f24d2bacd7be06fd3342b2"
       ],
       "layout": "IPY_MODEL_ccc1b1cfa01d47f582da14067e8007c3"
      }
     },
     "6d04ba48609b46c5bdfd41cbdc41772f": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_a7f2e32c80874da7bc277a860b94e642",
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "2018-03-29 21:59:21,537  - [ERROR] An error occurred!\nTraceback (most recent call last):\n  File \"<ipython-input-15-43aa6f6a7e65>\", line 6, in <module>\n    1.0/0.0\nZeroDivisionError: float division by zero\n"
        },
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "2018-03-29 21:59:21,537  - [INFO] About to try something dangerous...\n"
        },
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "2018-03-29 21:59:21,536  - [INFO] Starting program\n"
        }
       ]
      }
     },
     "73061142b6f24d2bacd7be06fd3342b2": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_2194b763d5d44bd7bdf3fe386ed3eaf0",
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "0*0*0=0\n"
        }
       ]
      }
     },
     "7e40d1ee1683499fa07dec9ba2f6eaeb": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_067590c647ef4381af813a832ac957f4"
      }
     },
     "81e818d308b04735b0a7be8e3f4e7f61": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "86cf2d818b694152a2546993001d35ac": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "879629718b224c37a05f58bae6f1d145": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "915a9f597ea44249ad35f426642a043e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "91803a9c53174d6a9a7d68c03ed8e766": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "ButtonModel",
      "state": {
       "description": "click me to raise an exception",
       "layout": "IPY_MODEL_f6b892bd1d4348af95c45f6b851834d5",
       "style": "IPY_MODEL_670cda42c4464cfab1079a63b18298c2"
      }
     },
     "9595fd27deb54240b79a312704d9751b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {
       "border": "1px solid black"
      }
     },
     "a7f2e32c80874da7bc277a860b94e642": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {
       "border": "1px solid black",
       "height": "160px",
       "width": "100%"
      }
     },
     "b04e215a9e414b1f8bfc0af39c2fa472": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "SliderStyleModel",
      "state": {
       "description_width": ""
      }
     },
     "b71c16133d064ce09bd11a212ee164bb": {
      "model_module": "@jupyter-widgets/output",
      "model_module_version": "1.0.0",
      "model_name": "OutputModel",
      "state": {
       "layout": "IPY_MODEL_cce9c2d6d14d402eaed457c90afeb1c6",
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": "0 Hello world!\n1 Hello world!\n2 Hello world!\n3 Hello world!\n4 Hello world!\n5 Hello world!\n6 Hello world!\n7 Hello world!\n8 Hello world!\n9 Hello world!\n"
        },
        {
         "data": {
          "image/jpeg": "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\n",
          "text/html": "\n        <iframe\n            width=\"400\"\n            height=\"300\"\n            src=\"https://www.youtube.com/embed/eWzY2nGfkXk\"\n            frameborder=\"0\"\n            allowfullscreen\n        ></iframe>\n        ",
          "text/plain": "<IPython.lib.display.YouTubeVideo at 0x108498c18>"
         },
         "metadata": {},
         "output_type": "display_data"
        },
        {
         "data": {
          "application/vnd.jupyter.widget-view+json": {
           "model_id": "daf3c6e022594b0b98f8fa00d6e43c81",
           "version_major": 2,
           "version_minor": 0
          },
          "text/plain": "IntSlider(value=0)"
         },
         "metadata": {},
         "output_type": "display_data"
        }
       ]
      }
     },
     "ccc1b1cfa01d47f582da14067e8007c3": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "cce9c2d6d14d402eaed457c90afeb1c6": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {
       "border": "1px solid black"
      }
     },
     "daf3c6e022594b0b98f8fa00d6e43c81": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "IntSliderModel",
      "state": {
       "layout": "IPY_MODEL_915a9f597ea44249ad35f426642a043e",
       "style": "IPY_MODEL_42f2b3f5056742cbb385d87c5965daf9"
      }
     },
     "e27ccf08bb8a4861ae3e7ae30b0be913": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "IntSliderModel",
      "state": {
       "description": "a",
       "layout": "IPY_MODEL_86cf2d818b694152a2546993001d35ac",
       "style": "IPY_MODEL_2af886b9351540bd9d339b6444c4c0e5"
      }
     },
     "e4b85a972fb644a6aab6f3dbd83c2b73": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "f5b3c2be494547a181d21595b3f8e202": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "1.2.0",
      "model_name": "VBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_e27ccf08bb8a4861ae3e7ae30b0be913",
        "IPY_MODEL_32f2ae1ff1744e4ebf5aea3e188c7774",
        "IPY_MODEL_664dce3fede04de69b413545e81a2d68"
       ],
       "layout": "IPY_MODEL_e4b85a972fb644a6aab6f3dbd83c2b73"
      }
     },
     "f6b892bd1d4348af95c45f6b851834d5": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "1.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "300px"
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
